package com.tzstcl.base.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.tzstcl.base.mapper.BaseMapper;
import com.tzstcl.base.service.BaseService;
import com.tzstcl.commons.utils.StringUtils;
import com.tzstcl.base.model.BaseModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 公司：天筑科技股份有限公司
 * 作者：zgq
 * 日期：2018年08月30日
 * 说明：
 */
@Transactional(readOnly = true, rollbackFor = Exception.class)
public class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseModel> implements BaseService<T> {

    /**
     * 日志对象
     */
    protected Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 持久层对象
     */
    @Autowired
    protected M mapper;

    /**
     * 排序分页查询
     *
     * @param var1
     * @return
     */
    @Override
    public PageInfo<T> selectSortPage(T var1) {
        var1.preSort();
        PageHelper.startPage(var1.getPageNum(), var1.getPageSize());
        return PageInfo.of(mapper.selectSortPage(var1));
    }

    /**
     * 分页查询
     *
     * @param var1
     * @return
     */
    @Override
    public PageInfo<T> selectPage(T var1) {
        PageHelper.startPage(var1.getPageNum(), var1.getPageSize());
        return PageInfo.of(mapper.select(var1));
    }

    /**
     * 查询
     *
     * @param var1
     * @return
     */
    @Override
    public List<T> selectList(T var1) {
        return mapper.select(var1);
    }

    /**
     * 新增记录（通过model）
     *
     * @param var1
     * @return
     */
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    @Override
    public Integer add(T var1) {
        var1.preInit();
        return mapper.insert(var1);
    }

    /**
     * 批量新增
     *
     * @param var1
     * @return
     */
    @Transactional(readOnly = false,rollbackFor = Exception.class)
    @Override
    public Integer insertBatch(List<T> var1) {
        return mapper.insertBatch(var1);
    }

    /**
     * 删除记录（通过id）
     *
     * @param id
     * @return
     */
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    @Override
    public Integer delete(Long id) {
        return mapper.delete(id);
    }

    /**
     * 批量删除(根据ids，例如 ：abc,def,efg,sdfw)
     *
     * @param ids
     * @return
     */
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    @Override
    public Integer deleteBatchIds(String ids) {
        if (StringUtils.isBlank(ids)) {
            return 0;
        }
        return mapper.deleteBatchByIDs(StringUtils.idsToList(ids));
    }

    /**
     * 更新(根据id)
     *
     * @param var1
     * @return
     */
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    @Override
    public Integer update(T var1) {
        return mapper.update(var1);
    }

    /**
     * 新增或者更新记录（通过model，非空列）
     *
     * @param var1
     * @return
     */
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    @Override
    public Integer insertOrUpdate(T var1) {
        //id为空新增操作
        if (null==var1.getId()) {
            var1.preInit();
            return mapper.insert(var1);
        } else {
            var1.preInit();
            return mapper.update(var1);
        }
    }

    /**
     * 查询单条model（通过id）
     *
     * @param id 数据id
     * @return
     */
    @Override
    public T getOne(Long id) {
        return mapper.getOne(id);
    }

    /**
     * 查询单条model（对象）
     *
     * @param var1 数据id
     * @return
     */
    @Override
    public T get(T var1) {
        return mapper.get(var1);
    }

}
